Aula 19 - joins

Módulo 2: Trabalhando com dados

Carolina Musso

PROFESP, DEMSP, MS

Esta semana

Aula 19 - Unindo bases de dados

Funções join()

Aula 20 - Trabalhando com texto (strings)

O pacote stringR

Aula 21 - Tabela

Mais sobre o pacote flextable: título, cabeçalho e fonte

Leituras para aprofundamento

O que vimos até agora nesse módulo

  • filter()
  • select()
  • %>%
  • mutate()
  • group_by()
  • summarise()
  • Hoje: left_join(), right_join(), …

Porque Unir bases

  • Base 1
# A tibble: 5 × 2
  date_onset hospital         
  <date>     <chr>            
1 2014-05-18 Port Hospital    
2 2014-05-21 Military Hospital
3 2014-05-22 Port Hospital    
4 2014-06-06 Port Hospital    
5 2014-06-13 Military Hospital
  • Base 2
# A tibble: 5 × 3
  Hospital          N_residentes level    
  <fct>                    <dbl> <chr>    
1 central hospital       1950280 Tertiary 
2 military hospital        40500 Secondary
3 military hospital        10000 Primary  
4 port hospital            50280 Secondary
5 central hospital         12000 Secondary

Que problemas podem aparecer?

Joins cássicos (não probabilísticos)

  • Preciso de pelo menos de uma coluna “chave” para união.

    • correspondência exata

Preciso Garantir

  • mesmo nome de coluna (é melhor)

  • mesma classe de coluna

  • nomes da chave que correspondam com exatidão

Voltando às bases

# A tibble: 5 × 2
  date_onset hospital         
  <date>     <chr>            
1 2014-05-18 Port Hospital    
2 2014-05-21 Military Hospital
3 2014-05-22 Port Hospital    
4 2014-06-06 Port Hospital    
5 2014-06-13 Military Hospital
# A tibble: 5 × 3
  Hospital          N_residentes level    
  <fct>                    <dbl> <chr>    
1 central hospital       1950280 Tertiary 
2 military hospital        40500 Secondary
3 military hospital        10000 Primary  
4 port hospital            50280 Secondary
5 central hospital         12000 Secondary

Primeiro problema

  • Mudar os nomes das colunas - Duas formas de fazer isso

pacote dplyr

  • rename()

  • Dá para encadear com o pipe %>%

R base

  • names()

  • deve ter aspas e também todos os nomes

Como fazer

  • Com o dplyr
ebola_mini <- ebola_mini %>% 
  rename(Inicio_sint=date_onset,
        Hospital=hospital)
  • Com o R base
names(ebola_mini) <- c("Inicio_sint", 
                     "Hospital")

Como ficou

# A tibble: 5 × 2
  Inicio_sint Hospital         
  <date>      <chr>            
1 2014-05-18  Port Hospital    
2 2014-05-21  Military Hospital
3 2014-05-22  Port Hospital    
4 2014-06-06  Port Hospital    
5 2014-06-13  Military Hospital
# A tibble: 5 × 3
  Hospital          N_residentes level    
  <fct>                    <dbl> <chr>    
1 central hospital       1950280 Tertiary 
2 military hospital        40500 Secondary
3 military hospital        10000 Primary  
4 port hospital            50280 Secondary
5 central hospital         12000 Secondary

Segundo problema

  • As colunas “chave” devem ser do mesmo tipo.

  • Vemos que nesse caso, uma é fator e a outra um caractere.

    • Devemos transformar uma delas

começamos com um mutate()

  • função as.?

    • as.numeric
    • as.character

. . .

hosp_info <- hosp_info %>% 
  mutate(Hospital=as.character(Hospital))

Como ficou

# A tibble: 5 × 2
  Inicio_sint Hospital         
  <date>      <chr>            
1 2014-05-18  Port Hospital    
2 2014-05-21  Military Hospital
3 2014-05-22  Port Hospital    
4 2014-06-06  Port Hospital    
5 2014-06-13  Military Hospital
# A tibble: 5 × 3
  Hospital          N_residentes level    
  <chr>                    <dbl> <chr>    
1 central hospital       1950280 Tertiary 
2 military hospital        40500 Secondary
3 military hospital        10000 Primary  
4 port hospital            50280 Secondary
5 central hospital         12000 Secondary

Terceiro problema

  • Os nomes não estão escritos da mesma forma

  • Funções úteis

    • toupper() ou str_to_upper()
    • tolower() ou str_to_lower()
    • veremos outras possibilidades na próxima aula
ebola_mini <- ebola_mini %>% 
  mutate(Hospital=str_to_lower(Hospital))
  • Uma boa prática é sempre padronizar os textos de todas as bases que for trabalhar antes de começar os joins.

Como ficou

# A tibble: 5 × 2
  Inicio_sint Hospital         
  <date>      <chr>            
1 2014-05-18  port hospital    
2 2014-05-21  military hospital
3 2014-05-22  port hospital    
4 2014-06-06  port hospital    
5 2014-06-13  military hospital
# A tibble: 5 × 3
  Hospital          N_residentes level    
  <chr>                    <dbl> <chr>    
1 central hospital       1950280 Tertiary 
2 military hospital        40500 Secondary
3 military hospital        10000 Primary  
4 port hospital            50280 Secondary
5 central hospital         12000 Secondary

Agora sim!

Podemos seguir com o join!

  • Repare no nome da função usada.
ebola_hosp_info  <-  left_join(ebola_mini, hosp_info)
# A tibble: 4 × 4
  Inicio_sint Hospital          N_residentes level    
  <date>      <chr>                    <dbl> <chr>    
1 2014-05-18  port hospital            50280 Secondary
2 2014-05-21  military hospital        40500 Secondary
3 2014-05-21  military hospital        10000 Primary  
4 2014-05-22  port hospital            50280 Secondary

Existem vários joins!

  • left_join()

  • right_join()

  • inner_join()

  • full_join()

  • semi_join()

  • anti_join()

  • E agora, qual usar?

left_join()

  • Mantém todas as linhas do data frame da esquerda, exclui as que não batem do data frame da direita.
base_unida <- left_join(a,b)

right_join()

  • Mantém todas as linhas do data frame da direita, exclui as que não batem do data frame da esquerda.
base_unida <- right_join(a,b)

full_join()

  • Mantém todas as linhas de ambas as bases -> completa com NA
base_unida <- full_join(a,b)

inner_join()

  • Mantém somente as linhas que há em ambas
base_unida <- inner_join(a,b)

semi_join()

  • Não faz join! -> filtra a base da esquerda de acordo com o que também tem na da direita
base_unida <- semi_join(a,b)

anti_join()

  • Não é exatamente um join! -> na verdade filtra a base da esquerda de acordo com o que não tem na da direita
base_unida <- anti_join(a,b)

Até a próxima aula!